//  给你一个链表的头节点 head ，判断链表中是否有环。
//
// 如果链表中有某个节点，可以通过连续跟踪 next 指针再次到达，则链表中存在环。 为了表示给定链表中的环，评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置（索引从 0 开始）。注意：pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
//
// 如果链表中存在环，则返回 true 。 否则，返回 false 。

//1. 快慢指针
//2. 哈希表
//3. 判断是否相交
//4. 判断是否有环
// 解法一

//根据数组创建环形链表
function createCycleList(arr) {
  let head = new ListNode(arr[0]);
  let cur = head;
  for (let i = 1; i < arr.length; i++) {
    cur.next = new ListNode(arr[i]);
    cur = cur.next;
  }
  cur.next = head;
  return head;
}
function ListNode(val) {
  this.val = val;
  this.next = null;
}
// var hasCycle = function(head) {
//   // 快慢指针初始化指向 head
//   let slow = head;
//   let fast = head;
//   // 快指针走到末尾时停止
//   while (fast && fast.next) {
//     // 慢指针走一步，快指针走两步
//     slow = slow.next;
//     fast = fast.next.next;
//     // 快慢指针相遇，说明含有环
//     if (slow === fast) {
//       return true;
//     }
//   }
//   // 不包含环
//   return false;
// };
var hasCycle = function(head) {
  let slow = head;
  let fast = head;
  while (slow && fast && fast.next) {
    slow = slow.next;
    fast = fast.next;
    if (slow === fast) {
      return true;
    }
  }
  return false;
};

let arr = [1, 2, 3, 4, 5];
let head = createCycleList(arr);
console.log(hasCycle(head));

